package net.sxnic.ugr.user;

import java.util.List;
import java.util.Map;

import net.sxinfo.core.spring25.Manager;
import net.sxnic.ugr.DwType;
import net.sxnic.ugr.dept.Dept;
import net.sxnic.ugr.group.Group;
import net.sxnic.ugr.role.Role;

import org.springframework.transaction.annotation.Transactional;

/**
 * UserManager interface
 *
 * @version 2.0.0
 * @author 孙宇飞
 */
@Transactional
public interface UserManager extends Manager<User,String>{

    /**
     * 根据用户名获取指定用户对应的User对象
     *
     * @param username 要获取的用户名
     * @return 指定用户对应的User对象
     */
    User getUserByUsername(String username);
    
    /**
     * 获取根据allIndex排序后的全部用户列表(admin除外)
     *
     * @return 根据allIndex排序后的全部用户列表(admin除外)
     */
    List<User> getOrderedUsersExceptAdmin();
        
    /**
     * 查询一个username,fullname的map
     * @return
     */
    Map<String,String> findUserMap();
    
    /**
     * 查询一个username,userorder的map
     * @return
     */
    Map<String,String> findUserOrderMap();
    
    /**
     * 查询一个部门的username,fullname的map
     * @param dept
     * @return
     */
    Map<String,String> findOrderGroupUserNameMap(String dept);    
 
    
    /**
     * 查询最大的排名
     * @param id
     * @return
     */
    int findMaxUserOrder();
    
    
    /**
     * 获取隶属指定组的用户列表
     *
     * @param group 用户
     * @return 具有指定角色的组列表
     */
    List<User> getUserInGroup(Group group);
    
    /**
     * 获取具有指定角色的用户列表
     *
     * @param group 用户
     * @return 具有指定角色的组列表
     */
    List<User> getUserInRole(Role role);
	
    /**
     * 根据用户名查询 此用户所在部门的处长，及处室排名第一个的人
     * @param userName
     * @return
     */
	User getChiefByUsername(String userName);
	
	/**
	 * 根据用户民查询 此用户所在部门的所有成员，包括处长
	 * @param userName 
	 * @return
	 */
	List<User> getAllDeptUsersByUsername(String userName);
	
	/**
	 * 根据部门编码查询 部门的处长，即部门排名第一的人
	 * @param deptCode
	 * @return
	 */
	User findGroupLeaderByDept(String deptCode);
	
	/**
	 * 查询所有领导列表 默认部门编码为0000
	 * @return
	 */
	List<User> getAllLeaders();
	
	/**
	 * 根据用户名查询所在部门
	 * @param userName
	 * @return
	 */
	Dept getDeptByUser(String userName);
	
	List<User> findAllChiefList();
	
	List<User> findZbkhAllChiefList();
	
	List<User> getAllStaffByDept(Dept dept);
  
    /**
     * 根据用户全称和用户类型获取用户实体
     * @param fullname 用户全称
     * @param dwType 枚举类型单位类别
     * @return 对应的实体
     */
    User getUserByFullname(String fullname,DwType dwType);
    
    /**
     * 根据类别获取所有用户
     * @return 某一类别的所有用户列表
     */
    List<User> findAllByDwType(DwType dwType);
    
    /**
     * 根据单位类别获取用户最大编码
     * @param dwType 单位类别
     * @return 指定类别的用户最大编码
     */
    String findMaxByDwType(DwType dwType);
    
    /**
     * 根据用户名前缀获取该类用户的最大编码
     * @param userPrefix 用户名前缀
     * @return 指定前缀的用户最大类别
     */ 
    String findMaxByUserPrefix(String userPrefix);
    
	/**
	 * 查询某一类别的所有用户的map
	 * @return
	 */
	@Transactional(readOnly=true)
	Map<String,String> findMap(DwType dwType);
}
